package com.bflow.commons.dao;

import com.bflow.commons.bean.QueryParam;
import com.bflow.commons.po.BasePo;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.session.RowBounds;

import java.io.Serializable;
import java.util.List;

/**
 * @Name XXX
 * @Author haowen
 * @Date 2018/12/12
 */
public interface IBaseDao<P extends BasePo> {


    /**
     * 根据id获取实体
     *
     * @param id 实体id
     * @return 实体
     */
    P findById(Serializable id);

    /**
     * 根据ids获取实体列表
     *
     * @param ids
     * @return
     */
    List<P> findByIds(@Param("ids") Serializable... ids);

    /**
     * 根据条件查询唯一数据记录
     *
     * @param param
     * @return
     */
    P findUniqueBy(Object param);

    /**
     * 查询全部数据列表
     *
     * @return
     */
    List<P> findAll();

    /**
     * 查询 最大ID
     * @return
     */
    Object getMaxId();

    /**
     * 根据param条件查询数据列表
     *
     * @param param
     * @return
     */
    List<P> findBy(Object param);

    /**
     * 根据queryParam条件查询总页数
     *
     * @param queryParam 查询条件
     * @return
     */
    long findPageCount(QueryParam queryParam);

    /**
     * 根据queryParam条件查询分页数据
     *
     * @param queryParam 查询条件
     * @return
     */
    List<P> findPage(QueryParam queryParam);

    /**
     * 根据queryParam条件查询分页数据
     *
     * @param queryParam 查询条件
     * @param rowBounds  分页信息(offset是当前页数 limit是当前页显示多少条数据)
     * @return
     */
    List<P> findPage(QueryParam queryParam, RowBounds rowBounds);

    /**
     * 是否存在指定条件的查询结果
     *
     * @param param
     * @return
     */
    boolean ExistBy(Object param);

    /**
     * 新增
     *
     * @param entity
     * @return 保存数据的记录数
     */
    int insert(P entity);

    /**
     * 批量新增
     *
     * @param entities 实体集合
     */
    int batchInsert(@Param("entities") List<P> entities);

    /**
     * 根据id删除实体
     *
     * @param id
     * @return
     */
    int deleteById(Serializable id);

    /**
     * 根据id删除实体
     *
     * @param ids
     * @return
     */
    int deleteByIds(@Param("ids") Serializable... ids);

    /**
     * 根据paramBean条件进行删除
     *
     * @param paramBean
     * @return
     */
    int deleteBy(P paramBean);

    /**
     * 根据queryParam条件进行删除
     *
     * @param queryParam
     * @return
     */
    int deleteBy(QueryParam queryParam);

    /**
     * 更新
     *
     * @param entity 实体
     * @return 更新数据的记录数
     */
    int update(P entity);

    /**
     * 批量更新
     *
     * @param entities
     */
    void batchUpdate(@Param("entities") List<P> entities);
}

